package com.aiassistant.util;

import org.apache.batik.transcoder.TranscoderException;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.PNGTranscoder;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

/**
 * SVG转换工具类，用于将SVG文件转换为PNG格式
 */
public class SVGConverter {

    /**
     * 将SVG文件转换为PNG文件
     * @param svgFile SVG文件路径
     * @param pngFile 输出的PNG文件路径
     */
    public static void convertSvgToPng(String svgFile, String pngFile) {
        try {
            // 创建转换器
            PNGTranscoder transcoder = new PNGTranscoder();
            
            // 设置输出图像的宽高，如果不设置则使用原始尺寸
            // transcoder.addTranscodingHint(PNGTranscoder.KEY_WIDTH, 24f);
            // transcoder.addTranscodingHint(PNGTranscoder.KEY_HEIGHT, 24f);
            
            // 创建输入流
            try (FileInputStream inputStream = new FileInputStream(svgFile)) {
                TranscoderInput input = new TranscoderInput(inputStream);
                
                // 确保输出目录存在
                File outputFile = new File(pngFile);
                outputFile.getParentFile().mkdirs();
                
                // 创建输出流
                try (FileOutputStream outputStream = new FileOutputStream(outputFile)) {
                    TranscoderOutput output = new TranscoderOutput(outputStream);
                    
                    // 执行转换
                    transcoder.transcode(input, output);
                    
                    System.out.println("成功转换: " + svgFile + " -> " + pngFile);
                }
            }
        } catch (Exception e) {
            System.err.println("转换失败: " + svgFile + " -> " + pngFile);
            e.printStackTrace();
        }
    }
    
    /**
     * 递归转换目录中的所有SVG文件
     * @param directory 要处理的目录
     */
    public static void convertAllSvgInDirectory(File directory) {
        if (!directory.isDirectory()) {
            return;
        }
        
        // 获取目录中的所有文件和子目录
        File[] files = directory.listFiles();
        if (files == null) {
            return;
        }
        
        for (File file : files) {
            if (file.isDirectory()) {
                // 递归处理子目录
                convertAllSvgInDirectory(file);
            } else if (file.getName().toLowerCase().endsWith(".svg")) {
                // 转换SVG文件
                String svgPath = file.getAbsolutePath();
                String pngPath = svgPath.substring(0, svgPath.length() - 4) + ".png";
                convertSvgToPng(svgPath, pngPath);
            }
        }
    }
    
    /**
     * 查找并转换所有SVG文件
     * @param rootDir 根目录
     * @return 转换的文件数量
     */
    public static int findAndConvertSvgFiles(String rootDir) {
        int count = 0;
        try {
            List<String> svgFiles = findSvgFiles(rootDir);
            for (String svgFile : svgFiles) {
                String pngFile = svgFile.substring(0, svgFile.length() - 4) + ".png";
                convertSvgToPng(svgFile, pngFile);
                count++;
            }
        } catch (IOException e) {
            System.err.println("查找SVG文件时出错: " + e.getMessage());
            e.printStackTrace();
        }
        return count;
    }
    
    /**
     * 查找目录中的所有SVG文件
     * @param directory 目录路径
     * @return SVG文件路径列表
     */
    private static List<String> findSvgFiles(String directory) throws IOException {
        List<String> svgFiles = new ArrayList<>();
        Files.walk(Paths.get(directory))
            .filter(Files::isRegularFile)
            .filter(path -> path.toString().toLowerCase().endsWith(".svg"))
            .forEach(path -> svgFiles.add(path.toString()));
        return svgFiles;
    }

    /**
     * 主方法，用于测试
     */
    public static void main(String[] args) {
        String imagesDir = "src/main/resources/com/aiassistant/images";
        System.out.println("开始转换SVG图标...");
        
        // 确保目录存在
        File dir = new File(imagesDir);
        if (!dir.exists()) {
            dir.mkdirs();
            System.out.println("创建目录: " + imagesDir);
        }
        
        // 递归转换所有SVG文件
        convertAllSvgInDirectory(dir);
        
        System.out.println("SVG转换完成!");
    }
} 